package beans;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

import javax.ejb.EJB;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;

import org.primefaces.event.SelectEvent;
import org.primefaces.model.DualListModel; 

import javax.faces.context.FacesContext;

import menagement.PacketMgr;
import menagement.UserMgr;
import menagement.dto.EscursioneDTO;
import menagement.dto.EscursioniPacchettoDTO;
import menagement.dto.HotelDTO;
import menagement.dto.HotelPacchettoDTO;
import menagement.dto.PacketDTO;
import menagement.dto.PrenotazioneDTO;
import menagement.dto.VoloDTO;



@ManagedBean (name="Retriever")
@SessionScoped
public class RetrieverBean {
	
	@EJB
	private PacketMgr packetMgr;
	@EJB
	private UserMgr userMgr;
	
	private ArrayList<VoloDTO> ListaCitta;
	private ArrayList<PacketDTO> ListaPacchetti;
	private List<PacketDTO> pacchettiFiltrati;
	private List<VoloDTO> voliFiltrati;
	private List<EscursioneDTO> escursioniFiltrate;
	private List<HotelDTO> hotelFiltrati;
	private PacketDTO pacchettoSelezionato;
	private VoloDTO voloPacchettoSelezionato;
	private ArrayList<HotelPacchettoDTO> ListaHotelInPacchetto;
	private ArrayList<EscursioniPacchettoDTO> ListaEscursioniInPacchetto;
	private ArrayList<VoloDTO> ListaVoliPerCitta;
	private DualListModel<HotelDTO> hotels;	  //dualList per la pickup degli hotel
	private ArrayList<HotelDTO> sourceHotels; //lista di hotel disponibili per il pacchetto da modificare, esclusi quelli che gia sono inclusi
	private ArrayList<HotelDTO> targetHotels; //lista di hotel che si vogliono includere nel pacchetto da modificare
	private DualListModel<EscursioneDTO> escursioni;
	private ArrayList<EscursioneDTO> sourceEscursioni;
	private ArrayList<EscursioneDTO> targetEscursioni;
	private ArrayList<HotelDTO> hotelDaEliminare= new ArrayList<HotelDTO>();
	private ArrayList<EscursioneDTO> escursioniDaEliminare= new ArrayList<EscursioneDTO>();
	private PrenotazioneDTO prenotazione;
	private int prezzoTotale;
	private int permanenza=0;
	
	public RetrieverBean(){
		prenotazione=new PrenotazioneDTO();
		prezzoTotale=0;
		pacchettoSelezionato= new PacketDTO();
		voloPacchettoSelezionato= new VoloDTO();
		pacchettiFiltrati= new ArrayList<PacketDTO>();
		voliFiltrati= new ArrayList<VoloDTO>();
		escursioniFiltrate= new ArrayList<EscursioneDTO>();
		hotelFiltrati=new ArrayList<HotelDTO>();
	}
	
	
	
	public int getPermanenza() {
		return permanenza;
	}
	public void setPermanenza(int permanenza) {
		this.permanenza = permanenza;
	}
	public List<VoloDTO> getVoliFiltrati() {
		return voliFiltrati;
	}
	public void setVoliFiltrati(List<VoloDTO> voliFiltrati) {
		this.voliFiltrati = voliFiltrati;
	}
	public List<EscursioneDTO> getEscursioniFiltrate() {
		return escursioniFiltrate;
	}
	public void setEscursioniFiltrate(List<EscursioneDTO> escursioniFiltrate) {
		this.escursioniFiltrate = escursioniFiltrate;
	}
	public List<HotelDTO> getHotelFiltrati() {
		return hotelFiltrati;
	}
	public void setHotelFiltrati(List<HotelDTO> hotelFiltrati) {
		this.hotelFiltrati = hotelFiltrati;
	}
	public int getPrezzoTotale() {
		return prezzoTotale;
	}
	public void setPrezzoTotale(int prezzoTotale) {
		this.prezzoTotale = prezzoTotale;
	}
	public PrenotazioneDTO getPrenotazione() {
		return prenotazione;
	}
	public void setPrenotazione(PrenotazioneDTO prenotazione) {
		this.prenotazione = prenotazione;
	}
	public ArrayList<HotelDTO> getHotelDaEliminare() {
		return hotelDaEliminare;
	}
	public void setHotelDaEliminare(ArrayList<HotelDTO> hotelDaEliminare) {
		this.hotelDaEliminare = hotelDaEliminare;
	}
	public ArrayList<EscursioneDTO> getEscursioniDaEliminare() {
		return escursioniDaEliminare;
	}
	public void setEscursioniDaEliminare(
			ArrayList<EscursioneDTO> escursioniDaEliminare) {
		this.escursioniDaEliminare = escursioniDaEliminare;
	}
	public DualListModel<EscursioneDTO> getEscursioni() {
		return escursioni;
	}
	public void setEscursioni(DualListModel<EscursioneDTO> escursioni) {
		this.escursioni = escursioni;
	}
	public ArrayList<EscursioneDTO> getSourceEscursioni() {
		return sourceEscursioni;
	}
	public void setSourceEscursioni(ArrayList<EscursioneDTO> sourceEscursioni) {
		this.sourceEscursioni = sourceEscursioni;
	}
	public ArrayList<EscursioneDTO> getTargetEscursioni() {
		return targetEscursioni;
	}
	public void setTargetEscursioni(ArrayList<EscursioneDTO> targetEscursioni) {
		this.targetEscursioni = targetEscursioni;
	}
	public DualListModel<HotelDTO> getHotels() {
		return hotels;
	}
	public void setHotels(DualListModel<HotelDTO> hotels) {
		this.hotels = hotels;
	}
	public ArrayList<HotelDTO> getSourceHotels() {
		return sourceHotels;
	}
	public void setSourceHotels(ArrayList<HotelDTO> sourceHotels) {
		this.sourceHotels = sourceHotels;
	}
	public ArrayList<HotelDTO> getTargetHotels() {
		return targetHotels;
	}
	public void setTargetHotels(ArrayList<HotelDTO> targetHotels) {
		this.targetHotels = targetHotels;
	}
	public ArrayList<VoloDTO> getListaVoliPerCitta() {
		return ListaVoliPerCitta;
	}
	public void setListaVoliPerCitta(ArrayList<VoloDTO> listaVoliPerCitta) {
		ListaVoliPerCitta = listaVoliPerCitta;
	}
	
	public VoloDTO getVoloPacchettoSelezionato() {
		return voloPacchettoSelezionato;
	}
	public void setVoloPacchettoSelezionato(VoloDTO voloPacchettoSelezionato) {
		this.voloPacchettoSelezionato = voloPacchettoSelezionato;
	}
	public ArrayList<HotelPacchettoDTO> getListaHotelInPacchetto() {
		return ListaHotelInPacchetto;
	}
	public void setListaHotelInPacchetto(
			ArrayList<HotelPacchettoDTO> listaHotelInPacchetto) {
		ListaHotelInPacchetto = listaHotelInPacchetto;
	}
	public ArrayList<EscursioniPacchettoDTO> getListaEscursioniInPacchetto() {
		return ListaEscursioniInPacchetto;
	}
	public void setListaEscursioniInPacchetto(
			ArrayList<EscursioniPacchettoDTO> listaEscursioniInPacchetto) {
		ListaEscursioniInPacchetto = listaEscursioniInPacchetto;
	}
	public PacketDTO getPacchettoSelezionato() {
		return pacchettoSelezionato;
	}
	public void setPacchettoSelezionato(PacketDTO pacchettoSelezionato) {
		this.pacchettoSelezionato = pacchettoSelezionato;
	}
	public List<PacketDTO> getPacchettiFiltrati() {
		return pacchettiFiltrati;
	}
	public void setPacchettiFiltrati(List<PacketDTO> pacchettiFiltrati) {
		this.pacchettiFiltrati = pacchettiFiltrati;
	}
	
	
	public ArrayList<VoloDTO> getListaCitta(){
		return ListaCitta;
	}
	public void setListaCitta(ArrayList<VoloDTO> lista){
		this.ListaCitta=lista;
	}
	
	
	public ArrayList<PacketDTO> getListaPacchetti() {
		return ListaPacchetti;
	}
	public void setListaPacchetti(ArrayList<PacketDTO> listaPacchetti) {
		ListaPacchetti = listaPacchetti;
	}
	
	public void trovaCitta()
	{
		ListaCitta = packetMgr.ListaCitta(); 
	}
	public void trovaPacchetti()
	{
		ListaPacchetti = packetMgr.ListaPacchetti();
		
	}
	
	public void trovaHotelEscursioni(){
		System.out.println("Pacchetto selezionato: "+pacchettoSelezionato.getNome());
		ListaEscursioniInPacchetto= packetMgr.ListaEscursioniPacchetto(pacchettoSelezionato.getIdPacchetto());
		ListaHotelInPacchetto= packetMgr.ListaHotelPacchetto(pacchettoSelezionato.getIdPacchetto());
		ListaVoliPerCitta= packetMgr.ListaVoliCitta(pacchettoSelezionato.getCodiceVolo());
		VoloDTO selezionato= new VoloDTO();
		//rimuovo il volo che gia avevo nel pachetto
		for(int i=0;i<ListaVoliPerCitta.size();i++){
			if(ListaVoliPerCitta.get(i).getCodice()==this.pacchettoSelezionato.getCodiceVolo()){
				selezionato=ListaVoliPerCitta.get(i);
				ListaVoliPerCitta.remove(i);
				voloPacchettoSelezionato=selezionato;
				break;
			}
		}	
	}
	
	public void trovaCittaPacchetto(){
		ArrayList<VoloDTO> listaVoli= packetMgr.trovaVoli();
		for(int i=0;i<ListaPacchetti.size();i++){
			for(int j=0; j<listaVoli.size();j++){
				if(ListaPacchetti.get(i).getCodiceVolo()==listaVoli.get(j).getCodice()){
					ListaPacchetti.get(i).setDestinazione(listaVoli.get(j).getCittaArrivo());
					break;
				}
			}
		}
	}
	
	public void pickUpListHotel(){
		sourceHotels=packetMgr.listaHotelCitta(pacchettoSelezionato.getCodiceVolo());
		targetHotels= new ArrayList<HotelDTO>();
		for(int k=0;k<sourceHotels.size();k++){
			for(int j=0; j<ListaHotelInPacchetto.size();j++){
				System.out.println("Entro in pickuplistHotel");
				if(sourceHotels.get(k).getCodice()==this.ListaHotelInPacchetto.get(j).getIdHotel()){
					targetHotels.add(sourceHotels.get(k));
					sourceHotels.remove(k);
				}
			}
		}
		hotels= new DualListModel<HotelDTO>(sourceHotels, targetHotels);
		for(int i=0;i<sourceHotels.size();i++)
			System.out.println("sourceHotels "+i+":"+sourceHotels.get(i).getCodice());
		for(int i=0;i<targetHotels.size();i++)
			System.out.println("targetHotels "+i+":"+targetHotels.get(i).getCodice());
	}
	
	public void pickUpListEscursioni(){
		sourceEscursioni=packetMgr.listaEscursioniCitta(pacchettoSelezionato.getCodiceVolo());
		targetEscursioni= new ArrayList<EscursioneDTO>();
		for(int k=0;k<sourceEscursioni.size();k++){
			for(int j=0; j<ListaEscursioniInPacchetto.size();j++){
				if(sourceEscursioni.get(k).getCodice()==this.ListaEscursioniInPacchetto.get(j).getIdEscursione()){
					targetEscursioni.add(sourceEscursioni.get(k));
					sourceEscursioni.remove(k);
				}
			}
		}
		escursioni= new DualListModel<EscursioneDTO>(sourceEscursioni, targetEscursioni);
		for(int i=0;i<sourceEscursioni.size();i++)
			System.out.println("sourceEscursioni "+i+":"+sourceEscursioni.get(i).getCodice());
		for(int i=0;i<targetEscursioni.size();i++)
			System.out.println("targetEscursioni "+i+":"+targetEscursioni.get(i).getCodice());
	}
	
	
	public String modificaProdottiInPacchetto(){
		System.out.println("SONO DENTRO");
		boolean giaPresente=false;
		ArrayList<HotelDTO> hotelDaAggiungere= new ArrayList<HotelDTO>();
		ArrayList<EscursioneDTO> escursioniDaAggiungere= new ArrayList<EscursioneDTO>();
		
		System.out.println("Prezzo iniziale: "+pacchettoSelezionato.getPrezzo());
		for(int i=0; i<ListaHotelInPacchetto.size();i++){
			System.out.println("Hotel "+ i+":" +ListaHotelInPacchetto.get(i).getIdHotel());
		}
		for(int i=0;i<hotels.getSource().size();i++){
			System.out.println("SourceHotel "+ i+":" +hotels.getSource().get(i).getNome());
		}
		
		// Se trovo in source alcune delle escursioni che avevo gia, vuol dire che sono da eliminare
		for(int i=0; i<ListaEscursioniInPacchetto.size();i++){
			System.out.println("SONO DENTRO 2");
			for(int j=0; j<escursioni.getSource().size();j++){
				System.out.println("SONO DENTRO 2.5");
				if(ListaEscursioniInPacchetto.get(i).getIdEscursione()==escursioni.getSource().get(j).getCodice()){
					escursioniDaEliminare.add(escursioni.getSource().get(j));
					break;
				}
			}
		}
		// Se trovo in source alcuni degli hotel che avevo gia, vuol dire che sono da eliminare
		for(int i=0; i<ListaHotelInPacchetto.size();i++){
			System.out.println("SONO DENTRO 3");
			for(int j=0; j<hotels.getSource().size();j++){
				System.out.println("SONO DENTRO 3.5");
				if(ListaHotelInPacchetto.get(i).getIdHotel()==hotels.getSource().get(j).getCodice()){
					System.out.println("Ha trovato in source un hotel che c'era gia e che deve quindi eliminare");
					hotelDaEliminare.add(hotels.getSource().get(j));
					break;
				}
			}
		}
		
		//Se in target ci sono quelli che c'erano gia all'inizio, allora non sono da inserire in DB
		for(int i=0; i<hotels.getTarget().size();i++){
			giaPresente=false;
			
			for(int j=0; j<ListaHotelInPacchetto.size();j++){
				System.out.println("SONO DENTRO 4");
				if(hotels.getTarget().get(i).getCodice()==ListaHotelInPacchetto.get(j).getIdHotel()){
					System.out.println("trovato hotel che c'era gia all'inizio in target");
					giaPresente=true;
				}
			}
			if(giaPresente==false){
				hotelDaAggiungere.add(hotels.getTarget().get(i));
				System.out.println("Hotel aggiunto: "+hotels.getTarget().get(i).getNome());
			}
				
		}
		//Se in target ci sono quelle che c'erano gia all'inizio, allora non sono da inserire in DB
		for(int i=0; i<escursioni.getTarget().size();i++){
			giaPresente=false;
			for(int j=0; j<ListaEscursioniInPacchetto.size();j++){
				if(escursioni.getTarget().get(i).getCodice()==ListaEscursioniInPacchetto.get(j).getIdEscursione()){
					giaPresente=true;
				}
			}
			if(giaPresente==false)
				escursioniDaAggiungere.add(escursioni.getTarget().get(i));
		}
		for(int i=0; i<hotelDaEliminare.size();i++){
			System.out.println("Da eliminare: "+ hotelDaEliminare.get(i).getNome());
		}
		for(int i=0; i<hotelDaAggiungere.size();i++){
			System.out.println("Da aggiungere: "+ hotelDaAggiungere.get(i).getNome());
		}
		
		//ricalcolo prezzo dopo modifica
		int prezzoFinale=0;
		if(!(pacchettoSelezionato.getCodiceVolo()==voloPacchettoSelezionato.getCodice())){ //se e diverso da quello iniziale devo andarmi a prendere il DTO giusto per avere tutti i getter
			VoloDTO attuale= new VoloDTO();
			for(int i=0; i<ListaVoliPerCitta.size();i++){
				if(pacchettoSelezionato.getCodiceVolo()==ListaVoliPerCitta.get(i).getCodice()){
					attuale=ListaVoliPerCitta.get(i);
					Calendar data1 = Calendar.getInstance();
					Calendar data2 = Calendar.getInstance();
					data1.setTime(attuale.getData());
					data2.setTime(attuale.getDataRitorno());
					long milliseconds1 = data1.getTimeInMillis();
					long milliseconds2 = data2.getTimeInMillis();
					long diff = milliseconds2 - milliseconds1;
					long diffDays = diff / (24 * 60 * 60 * 1000);  //differenza in giorni
					permanenza=(int)diffDays;
					break;
				}
			}
			prezzoFinale=prezzoFinale+attuale.getPrezzo();
		}
		else{
			Calendar data1 = Calendar.getInstance();
			Calendar data2 = Calendar.getInstance();
			data1.setTime(voloPacchettoSelezionato.getData());
			data2.setTime(voloPacchettoSelezionato.getDataRitorno());
			long milliseconds1 = data1.getTimeInMillis();
			long milliseconds2 = data2.getTimeInMillis();
			long diff = milliseconds2 - milliseconds1;
			long diffDays = diff / (24 * 60 * 60 * 1000);  //differenza in giorni
			permanenza=(int)diffDays;
			prezzoFinale=prezzoFinale+voloPacchettoSelezionato.getPrezzo();
		}
		for(int i=0; i<hotels.getTarget().size();i++){
			prezzoFinale=prezzoFinale+hotels.getTarget().get(i).getPrezzo()*permanenza;
		}
		
		for(int i=0; i<escursioni.getTarget().size();i++){
			prezzoFinale=prezzoFinale+escursioni.getTarget().get(i).getPrezzo();
		}
		prezzoFinale=(int)(Math.ceil((prezzoFinale)*1.15)); //aggiungo il 15% di guadagno
		System.out.println("Prezzo finale: "+prezzoFinale);
		pacchettoSelezionato.setPrezzo(prezzoFinale);
		
		System.out.println("Sono prima di chiamare il packetManager");
		packetMgr.updateProdottiPacchetto(userMgr.getUserDTO().getEmail(),pacchettoSelezionato, hotelDaEliminare,hotelDaAggiungere, escursioniDaEliminare,escursioniDaAggiungere);
		System.out.println("Sono dopo aver chiamato il packetManager");
		
		FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("Retriever", null); //per eliminare la sessione e i dati del bean
		
		return "ricercaPacchetto";
	}
	
	public void onRowSelect(SelectEvent event){
		
		trovaHotelEscursioni();
		pickUpListEscursioni();
		pickUpListHotel();
		
		FacesMessage msg = new FacesMessage("Pacchetto selezionato", ((PacketDTO) event.getObject()).getNome());  
		FacesContext.getCurrentInstance().addMessage(null, msg);
	}
	
	public void onButtonSelect(){
		
		trovaHotelEscursioni();
		pickUpListEscursioni();
		pickUpListHotel();
		
	}
	
	
	public String riepilogoPacchetto(){
		System.out.println("aummaum");
		int prezzoPersone=0;
		//calcolo prezzo totale
		
		Calendar data1 = Calendar.getInstance();
		Calendar data2 = Calendar.getInstance();
		data1.setTime(voloPacchettoSelezionato.getData());
		data2.setTime(voloPacchettoSelezionato.getDataRitorno());
		long milliseconds1 = data1.getTimeInMillis();
		long milliseconds2 = data2.getTimeInMillis();
		long diff = milliseconds2 - milliseconds1;
		long diffDays = diff / (24 * 60 * 60 * 1000);  //differenza in giorni
		permanenza=(int)diffDays;
		
		for(int i=0; i<targetHotels.size();i++){
			prezzoPersone=prezzoPersone+targetHotels.get(i).getPrezzo()*(prenotazione.getN_Persone())*permanenza;
		}
		for(int i=0; i<targetEscursioni.size();i++){
			prezzoPersone=prezzoPersone+targetEscursioni.get(i).getPrezzo()*(prenotazione.getN_Persone());
		}
		
		prezzoPersone=prezzoPersone+voloPacchettoSelezionato.getPrezzo()*(prenotazione.getN_Persone());
		
		prezzoTotale=(int)(Math.ceil((prezzoPersone)*1.15)); //aggiungo il 15% di guadagno
		HotelDTO hdto=new HotelDTO();
		boolean checkPostiHotel=true;
		boolean checkPostiVolo=true;
		Date data=new Date();
		System.out.println(data);
		prenotazione.setData(data);
		prenotazione.setEmail(userMgr.getUserDTO().getEmail());
		System.out.println(userMgr.getUserDTO().getEmail());
		prenotazione.setCodiceVolo(pacchettoSelezionato.getCodiceVolo());
		System.out.println("aummaum2");
		if(voloPacchettoSelezionato.getPosti_Disponibili()<prenotazione.getN_Persone())
			checkPostiVolo=false;
		for(int i=0; i<targetHotels.size();i++){
			if(targetHotels.get(i).getStanze_Disponibili()<prenotazione.getN_Persone()){
				checkPostiHotel=false;
				hdto=targetHotels.get(i);
				break;
			}
		}
		System.out.println("aummaum3");
		if(checkPostiHotel==true && checkPostiVolo==true){
			return "riepilogo?faces-redirect=true";
		}
		else if((checkPostiHotel==false && checkPostiVolo==true) || (checkPostiHotel==false && checkPostiVolo==false)){
			FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_ERROR,"Uno degli hotel selezionati non ha la disponibilita richiesta. Si prega di cambiare hotel, controllandone prima la disponibilita", hdto.getNome());
	        FacesContext.getCurrentInstance().addMessage(null, msg);
			return null;
		}
		else {
			FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_ERROR,"Il volo selezionato non ha la disponibilita richiesta. Si prega di personalizzare, e sceglierne uno con la disponibilita desiderata", "");
	        FacesContext.getCurrentInstance().addMessage(null, msg);
			return null;
		}
		
		
	}
	
	public String riepilogoPacchettoPersonalizzato(){
		System.out.println("aummaum");
		
		boolean checkPostiHotel=true; //per il controllo della disponibilita > della richiesta
		boolean checkPostiVolo=true; //per il controllo della disponibilita > della richiesta
		//calcolo prezzo totale
		int prezzoPersone=0;
		for(int i=0; i<hotels.getTarget().size();i++){
			prezzoPersone=prezzoPersone+hotels.getTarget().get(i).getPrezzo()*(prenotazione.getN_Persone());
		}
		
		for(int i=0; i<escursioni.getTarget().size();i++){
			prezzoPersone=prezzoPersone+escursioni.getTarget().get(i).getPrezzo()*(prenotazione.getN_Persone());
		}
		
		if(!(pacchettoSelezionato.getCodiceVolo()==voloPacchettoSelezionato.getCodice())){ //se e diverso da quello iniziale devo andarmi a prendere il DTO giusto per avere tutti i getter
			VoloDTO attuale= new VoloDTO();
			for(int i=0; i<ListaVoliPerCitta.size();i++){
				if(pacchettoSelezionato.getCodiceVolo()==ListaVoliPerCitta.get(i).getCodice()){
					attuale=ListaVoliPerCitta.get(i);
					break;
				}
			}
			if(attuale.getPosti_Disponibili()<prenotazione.getN_Persone()){
				checkPostiVolo=false;
			}
				
			prezzoPersone=prezzoPersone+attuale.getPrezzo()*(prenotazione.getN_Persone());
			prenotazione.setCodiceVolo(attuale.getCodice());
			
		}
		else{
			prezzoPersone=prezzoPersone+voloPacchettoSelezionato.getPrezzo()*(prenotazione.getN_Persone());
			prenotazione.setCodiceVolo(voloPacchettoSelezionato.getCodice());
			if(voloPacchettoSelezionato.getPosti_Disponibili()<prenotazione.getN_Persone()){
				checkPostiVolo=false;
			}
		}
		prezzoTotale=(int)(Math.ceil((prezzoPersone)*1.15)); //aggiungo il 15% di guadagno
		
		Date data=new Date();
		System.out.println(data);
		prenotazione.setData(data);
		prenotazione.setEmail(userMgr.getUserDTO().getEmail());
		System.out.println(userMgr.getUserDTO().getEmail());
		prenotazione.setCodiceVolo(pacchettoSelezionato.getCodiceVolo());
		System.out.println("aummaum2");
		
		// controllo il check posti e se e' falso salvo il primo degli hotel che da problemi di diponibilita
		HotelDTO hdto=new HotelDTO(); //nel caso dia problemi
		
		for(int i=0; i<targetHotels.size();i++){
			if(targetHotels.get(i).getStanze_Disponibili()<prenotazione.getN_Persone()){
				checkPostiHotel=false;
				hdto=targetHotels.get(i);
				break;
			}
		}
		System.out.println("aummaum3");
		if(checkPostiHotel==true && checkPostiVolo==true){
			return "riepilogoPersonalizzato?faces-redirect=true";
		}
		else if((checkPostiHotel==false && checkPostiVolo==true) || (checkPostiHotel==false && checkPostiVolo==false)){
			FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_ERROR,"Uno degli hotel selezionati non ha la disponibilita richiesta. Si prega di cambiare hotel, controllandone prima la disponibilita", hdto.getNome());
	        FacesContext.getCurrentInstance().addMessage(null, msg);
			return null;
		}
		else {
			FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_ERROR,"Il volo selezionato non ha la disponibilita richiesta. Si prega di cambiare volo, controllandone prima la disponibilita", "");
	        FacesContext.getCurrentInstance().addMessage(null, msg);
			return null;
		}
		
		
	}
	
	public String compraPacchettoPredefinito(){
		System.out.println(pacchettoSelezionato.getPrezzo());
		
		prenotazione.setPrezzo(prezzoTotale);
		
		int idPren=packetMgr.persistPrenotazione(prenotazione); //non faccio tutto in una funzione unica perche da dei problemi con 
																//i persist degli hotel/escursioni nei for(in pratica persista prima le cose ne for che la prenotazione e quindi nn trova l'id prenotazione)
		if(targetHotels.size()!=0){
			for(int i=0; i<targetHotels.size();i++){
				packetMgr.persistHotel(targetHotels.get(i), idPren, prenotazione.getN_Persone());
			}
		}
		if(targetEscursioni.size()!=0){
			for(int i=0; i<targetEscursioni.size();i++){
				packetMgr.persistEscursione(targetEscursioni.get(i), idPren);
			}
		}
		
		FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("Retriever", null);
		
		return "congrats?faces-redirect=true";
	}
	
	public String compraPacchettoPersonalizzato(){
		
		prenotazione.setPrezzo(prezzoTotale);
		
		int idPren=packetMgr.persistPrenotazione(prenotazione); //non faccio tutto in una funzione unica perche da dei problemi con 
																//i persist degli hotel/escursioni nei for (in pratica persista prima le cose nel for che la prenotazione e quindi nn trova l'id prenotazione)
		if(hotels.getTarget().size()!=0){
			for(int i=0; i<hotels.getTarget().size();i++){
				packetMgr.persistHotel(hotels.getTarget().get(i), idPren, prenotazione.getN_Persone());
			}
		}
		if(escursioni.getTarget().size()!=0){
			for(int i=0; i<escursioni.getTarget().size();i++){
				packetMgr.persistEscursione(escursioni.getTarget().get(i), idPren);
			}
		}

		FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("Retriever", null);
		
		return "congrats?faces-redirect=true";
	}
	
	public String printer(){
		System.out.println("Sono qua");
		return "congrats?faces-redirect=true";
	}
	
}
